The explosive growth of the Internet has been spurred to a great extent by the modularity of the Internet protocol stack. The protocol stack used by the Internet follows the OSI model, which stresses stackability by requiring that layers interface with each other in very strict and limited ways. That is, sharing of information between layers is discouraged. This focus on stackability has enabled the independent development and validation of robust protocols. However, the lack of information in one layer about how another layer is operating can lead to non-optimal performance. This is particularly true in dynamic settings when network conditions can change quite dramatically. Thus, a need arises for these and other problems to be addressed.